Git Branch Merge

शाखाओं का विलय करना और अपने काम को समेकित करना सीखें

Git में मर्जिंग क्या है?

Git में मर्ज करने का अर्थ है एक शाखा से दूसरी शाखा में परिवर्तन को मर्ज करना।

यह अलग-अलग सुविधाओं या बग फिक्स पर अलग-अलग काम करने के बाद अपने काम को एक साथ लाने का एक तरीका है।

सामान्य गिट मर्ज विकल्प

git merge

किसी शाखा को अपनी वर्तमान शाखा में मर्ज करें

git merge --no-ff

हमेशा एक मर्ज कमिट बनाएं

git merge --squash

परिवर्तनों को एक प्रतिबद्धता में सम्मिलित करें

git merge --abort

चल रहे मर्ज को निरस्त करें

गिट मर्ज शाखाएँ

एक शाखा से दूसरी शाखा में परिवर्तनों को मर्ज करने के लिए गिट मर्ज का उपयोग करें।

सामान्य तौर पर, पहले उस शाखा पर स्विच करें जिसे आप मर्ज करना चाहते हैं (आमतौर पर मुख्य या मास्टर), फिर उस शाखा के नाम के साथ मर्ज कमांड चलाएँ जिसे आप मर्ज करना चाहते हैं।

उदाहरण

git checkout master
Switched to branch 'master'
git merge emergency-fix
Updating 09f4acd..dfa79db
Fast-forward
 index.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

आपातकालीन-फिक्स शाखा सीधे मास्टर से आती है, और जब हमने इस पर काम किया तो मास्टर में कोई अन्य परिवर्तन नहीं किया गया था, इसलिए Git इसे मास्टर की निरंतरता के रूप में देखता है।

तो यह मास्टर और आपातकालीन-फ़िक्स दोनों को एक ही प्रतिबद्धता की ओर इंगित करते हुए "तेज़ी से आगे" बढ़ सकता है।

शाखाओं के विलय के लिए सर्वोत्तम प्रथाएँ

💡सर्वोत्तम प्रथाएं:

  • मर्ज शुरू करने से पहले हमेशा अपने परिवर्तन प्रतिबद्ध करें या छिपाकर रखें
  • टकरावों को कम करने के लिए हमेशा महत्वपूर्ण शाखा से अपनी फीचर शाखा में विलय करें
  • विवादों को सावधानी से सुलझाएं—सभी परिवर्तनों को आंख मूंदकर स्वीकार न करें
  • स्पष्ट और वर्णनात्मक मर्ज प्रतिबद्ध संदेश लिखें

व्यावहारिक उदाहरण

विलय का त्याग करें

git merge --abort

मर्ज के दौरान स्थिति देखें

git status

विरोध का समाधान करें और विलय समाप्त करें

विरोध फ़ाइल को संपादित करें, फिर git जोड़ें और git कमिट करें

Fast-forward merge

ऐसा तब होता है जब नए कमिट अलग-अलग नहीं होते—Git ब्रांच पॉइंटर को आगे बढ़ाता है

No-fast-forward merge

शाखा इतिहास को संरक्षित करने के लिए git merge --no-ff शाखा का उपयोग करें

उदाहरण: एक शाखा हटाना

git branch -d emergency-fix
Deleted branch emergency-fix (was dfa79db)

Non-Fast-Forward Merge (git merge --no-ff)

डिफ़ॉल्ट रूप से, यदि आप अपनी शाखा को फास्ट-फॉरवर्ड (मूल रूप से कोई नया कमिट नहीं) के साथ मर्ज कर सकते हैं, तो Git शाखा पॉइंटर को आगे बढ़ा देगा।

जब भी आप मर्ज कमिट बनाना चाहते हैं (इतिहास को स्पष्ट रखने के लिए), git merge --no-ffbranchname का उपयोग करें।

उदाहरण

git merge --no-ff feature-branch
Merge made by the 'recursive' strategy.
 index.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Squash Merge (git merge --squash)

यदि आप किसी शाखा के सभी परिवर्तनों को एक कमिट में मर्ज करना चाहते हैं (प्रत्येक कमिट को रखने के बजाय), तो git merge --squashbranchname का उपयोग करें

यह विलय से पहले प्रतिबद्ध इतिहास को साफ करने के लिए उपयोगी है।

उदाहरण

git merge --squash feature-branch
Squash commit -- not updating HEAD
Automatic merge went well; stopped before committing as requested

मर्ज को निरस्त करना (git merge --abort)

यदि मर्ज के दौरान कोई समस्या आती है (जैसे कि कोई विवाद जो हल नहीं होना चाहता), तो आप git merge --abort के साथ मर्ज को रद्द कर सकते हैं और जहां यह पहले था वहां वापस जा सकते हैं।

उदाहरण

git merge --abort

Merge Conflict क्या हैं?

मर्ज विरोध तब होता है जब दो शाखाओं में परिवर्तन रिपॉजिटरी के एक ही हिस्से को छूते हैं और Git को पता नहीं होता है कि कौन सा संस्करण रखना है।

यह ऐसा है जैसे दो लोग किसी दस्तावेज़ में एक ही वाक्य को अलग-अलग तरीकों से संपादित कर रहे हों—गिट को यह तय करने में आपकी सहायता की आवश्यकता है कि किस संस्करण का उपयोग करना है।

मर्ज विरोध का समाधान कैसे करें

Git .

आपको फ़ाइल खोलनी होगी, <<<<<<< HEAD और ======= जैसी पंक्तियों को देखना होगा और तय करना होगा कि अंतिम संस्करण क्या होना चाहिए।

फिर, चरणबद्ध करें और अपने परिवर्तन प्रतिबद्ध करें।

समस्या समाधान एवं सहायता नोट्स

⚠️ महत्वपूर्ण सुझाव:

  • यदि आप मर्ज को निरस्त करना चाहते हैं, तो git merge --abort का उपयोग करें
  • मर्ज शुरू करने से पहले हमेशा अपने परिवर्तन प्रतिबद्ध करें या छिपाकर रखें
  • विरोध चिह्नकों पर सावधानी से कदम बढ़ाएँ और समस्या का समाधान करने के बाद उन्हें हटा दें
  • यह देखने के लिए git status का उपयोग करें कि किन फ़ाइलों पर आपको ध्यान देने की आवश्यकता है
  • यदि अनिश्चित हो, तो टीम के किसी सदस्य से पूछें या त्रुटि संदेश खोजें

मर्ज संघर्ष उदाहरण

आइए अंतिम अध्याय से हैलो-वर्ल्ड-इमेजिस की ओर बढ़ें और काम करना जारी रखें।

शाखा स्विचिंग और फ़ाइल स्विचिंग

git checkout hello-world-images
Switched to branch 'hello-world-images'
cat index.html
<!DOCTYPE html>
<html>
<head>
<title>Hello World!</title>
<link rel="stylesheet" href="bluestyle.css">
</head>
<body>

<h1>Hello world!</h1>
<div><img src="img_hello_world.jpg" alt="Hello World from Space" style="width:100%;max-width:960px"></div>
<p>This is the first file in my new Git Repo.</p>
<p>A new line in our file!</p>
<div><img src="img_hello_git.jpg" alt="Hello Git" style="width:100%;max-width:640px"></div>

</body>
</html>

अब, हमने यहां अपना काम पूरा कर लिया है और इस शाखा के लिए मंच तैयार कर सकते हैं:

करने से

git add --all
git commit -m "added new image"
[hello-world-images 1f1584e] added new image
 2 files changed, 1 insertion(+)
 create mode 100644 img_hello_git.jpg

index.html .

अब हम मास्टर को हैलो-वर्ल्ड-इमेज संलग्न करने के लिए तैयार हैं।

लेकिन हाल ही में हमने जिन बदलावों में महारत हासिल की है, उनका क्या होगा?

विलय का प्रयास

git checkout master
git merge hello-world-images
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.

index.html- merge .

आइए स्थिति पर नजर डालें:

स्थिति की जांच

git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Changes to be committed:
        new file:   img_hello_git.jpg
        new file:   img_hello_world.jpg

Unmerged paths:
  (use "git add ..." to mark resolution)
        both modified:   index.html

यह पुष्टि करता है कि Index.html में विरोध है, लेकिन छवि फ़ाइलें प्रतिबद्ध होने के लिए तैयार हैं।

इसलिए हमें उस संघर्ष को ठीक करने की जरूरत है। हमारे संपादक में फ़ाइल खोलें:

संघर्ष फ़ाइल

<!DOCTYPE html>
<html>
<head>
<title>Hello World!</title>
<link rel="stylesheet" href="bluestyle.css">
</head>
<body>

<h1>Hello world!</h1>
<div><img src="img_hello_world.jpg" alt="Hello World from Space" style="width:100%;max-width:960px"></div>
<p>This is the first file in my new Git Repo.</p>
<<<<<<< HEAD
<p>This line is here to show how merging works.</p>
=======
<p>A new line in our file!</p>
<div><img src="img_hello_git.jpg" alt="Hello Git" style="width:100%;max-width:640px"></div>
>>>>>>> hello-world-images

</body>
</html>

हम संस्करणों के बीच अंतर देख सकते हैं और आवश्यकतानुसार संपादित कर सकते हैं:

हल की गई फ़ाइल

<!DOCTYPE html>
<html>
<head>
<title>Hello World!</title>
<link rel="stylesheet" href="bluestyle.css">
</head>
<body>

<h1>Hello world!</h1>
<div><img src="img_hello_world.jpg" alt="Hello World from Space" style="width:100%;max-width:960px"></div>
<p>This is the first file in my new Git Repo.</p>
<p>This line is here to show how merging works.</p>
<div><img src="img_hello_git.jpg" alt="Hello Git" style="width:100%;max-width:640px"></div>

</body>
</html>

अब हम Index.html को चरणबद्ध कर सकते हैं और स्थिति की जांच कर सकते हैं:

युद्ध वियोजन

git add index.html
git status
On branch master
All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:
        new file:   img_hello_git.jpg
        new file:   img_hello_world.jpg
        modified:   index.html

विरोध ठीक हो गया है, और आप मर्ज समाप्त करने के लिए कमिट का उपयोग कर सकते हैं:

मर्ज पूरा करना

git commit -m "merged with hello-world-images after fixing conflicts"
[master e0b6038] merged with hello-world-images after fixing conflicts

हैलो-वर्ल्ड-इमेजेज शाखा को भी हटाएं:

एक शाखा हटाना

git branch -d hello-world-images
Deleted branch hello-world-images (was 1f1584e)

🎉बधाई हो!

अब आपको इसकी बेहतर समझ हो गई है कि शाखाएं और विलय कैसे काम करते हैं।

रिमोट रिपॉजिटरी के साथ काम शुरू करने का समय!